package zip;

import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class TestZip extends Frame implements ActionListener {
	TextArea textarea; // 显示数据文件的多行文本显示域
	TextField infotip; // 显示数据文件未压缩大小及压缩大小单行文本显示域
	String doc; // 存储随机生成的数据
	long doczipsize = 0;// 压缩数据文件的大小

	public TestZip() {
		// 生成菜单
		MenuBar menubar = new MenuBar();
		setMenuBar(menubar);
		Menu file = new Menu("File", true);
		menubar.add(file);
		MenuItem neww = new MenuItem("New");
		neww.addActionListener(this);
		file.add(neww);
		MenuItem open = new MenuItem("Open");
		open.addActionListener(this);
		file.add(open);
		MenuItem save = new MenuItem("Save");
		save.addActionListener(this);
		file.add(save);
		MenuItem exit = new MenuItem("Exit");
		exit.addActionListener(this);
		file.add(exit);
		
		// 随机生成的数据文件的多行文本显示域
		add("Center", textarea = new TextArea());
		
		// 提示文本原始大小、压缩大小的单行文本显示域
		add("South", infotip = new TextField());
	}

	public static void main(String args[]) {
		TestZip ok = new TestZip();
		ok.setTitle("zip sample");
		ok.setSize(600, 300);
		ok.show();
	}

	private void randomData() {
		
		// 随机生成50个double数据,并放在doc字符串变量中。
		doc = "";
		for (int i = 1; i < 51; i++) {
			double rdm = Math.random() * 10;
			doc = doc + new Double(rdm).toString();
			if (i % 5 == 0)
				doc = doc + "\n";
			else
				doc = doc + " ";
		}
		doczipsize = 0;
		showTextandInfo();
	}

	private void openFile() {
		
		// 打开zip文件,将文件内容读入doc字符串变量中。
		FileDialog dlg = new FileDialog(this, "Open", FileDialog.LOAD);
		dlg.show();
		String filename = dlg.getDirectory() + dlg.getFile();
		try {
			
			// 创建一个文件实例
			File f = new File(filename);
			if (!f.exists())
				return; // 文件不存在,则返回
			
			// 用文件输入流构建ZIP压缩输入流
			ZipInputStream zipis = new ZipInputStream(new FileInputStream(f));
			zipis.getNextEntry();
			
			// 将输入流定位在当前entry数据项位置
			DataInputStream dis = new DataInputStream(zipis);
			
			// 用ZIP输入流构建DataInputStream
			doc = dis.readUTF();// 读取文件内容
			
			
			dis.close();// 关闭文件
			doczipsize = f.length();// 获取ZIP文件长度
			showTextandInfo();// 显示数据
		} catch (IOException ioe) {
			System.out.println(ioe);
		}
	}

	private void saveFile() {
		
		// 打开zip文件,将doc字符串变量写入zip文件中。
		FileDialog dlg = new FileDialog(this, "Save", FileDialog.SAVE);
		dlg.show();
		String filename = dlg.getDirectory() + dlg.getFile();
		try {
			
			// 创建一个文件实例
			File f = new File(filename);
			if (!f.exists())
				return; // 文件不存在,则返回
			
			// 用文件输出流构建ZIP压缩输出流
			ZipOutputStream zipos = new ZipOutputStream(new FileOutputStream(f));
			
			zipos.setMethod(ZipOutputStream.DEFLATED); // 设置压缩方法

			zipos.putNextEntry(new ZipEntry("zip"));
			
			// 生成一个ZIP entry,写入文件输出流中,并将输出流定位于entry起始处。
			DataOutputStream os = new DataOutputStream(zipos);
			
			// 用ZIP输出流构建DataOutputStream;
			os.writeUTF(doc);// 将随机生成的数据写入文件中
			os.close();// 关闭数据流
			doczipsize = f.length();
			
			// 获取压缩文件的长度
			showTextandInfo();// 显示数据
		} catch (IOException ioe) {
			System.out.println(ioe);
		}
	}

	private void showTextandInfo() {
		// 显示数据文件和压缩信息
		textarea.replaceRange(doc, 0, textarea.getText().length());
		infotip.setText("uncompressed size: " + doc.length()
				+ "compressed size: " + doczipsize);
	}

	public void actionPerformed(ActionEvent e) {
		String arg = e.getActionCommand();
		if ("New".equals(arg))
			randomData();
		else if ("Open".equals(arg))
			openFile();
		else if ("Save".equals(arg))
			saveFile();
		else if ("Exit".equals(arg)) {
			dispose();// 关闭窗口
			System.exit(0);// 关闭程序
		} else {
			System.out.println("no this command!");
		}
	}
}